home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 2: CDPD 1 / Almathera Ten on Ten - Disc 2: CDPD 1.iso / pd / 351-375 / 359 / dice / dice.lzh / lib / memory / setmem.a < prev    next >
Text File  |  1990-03-27  |  2KB  |  87 lines

  1.  
  2.         ;   SETMEM.A
  3.         ;
  4.         ;   (c)Copyright 1990, Matthew Dillon, All Rights Reserved
  5.  
  6.         section text,CODE
  7.  
  8.         ;   setmem(buffer, len, byte)
  9.         ;     4(sp)   ...
  10.         ;       D0      D1    A0
  11.         ;   clrmem(buffer, len)
  12.         ;   bzero(buffer, len)
  13.         ;      4(sp) ...
  14.         ;        D0      D1
  15.  
  16.  
  17.         xdef    _setmem
  18.         xdef    _clrmem
  19.         xdef    _bzero
  20.  
  21. _bzero:
  22. _clrmem:    moveq.l #0,D1
  23.         bra    xbz0
  24. _setmem:    move.b    12+3(sp),D1
  25. xbz0        move.l    4(sp),A0
  26.         move.l    8(sp),D0
  27.  
  28.         add.l    D0,A0        ; start at end of address
  29.         cmp.l    #40,D0        ; unscientifically chosen
  30.         bls    xbs2
  31.         bra    xbs10
  32. xbs1        move.b    D1,-(A0)    ; any count < 65536
  33. xbs2        dbf    D0,xbs1
  34.         rts
  35.  
  36.                     ; at least 4 bytes in count (D0)
  37. xbs10        movem.l D2-D7/A2-A6,-(sp)   ;any count > 4
  38.         move.w    A0,D2
  39.         lsr.l    #1,D2        ; is it aligned?
  40.         bcc    xbs22
  41.         move.b    D1,-(A0)    ; no, copy one byte
  42.         subq.l    #1,D0
  43.  
  44. xbs22        andi.l    #$FF,D1     ; expand data D1.B -> D2-D7/A1-A6
  45.         move.l    D1,D2        ; D1 000000xx   D2 000000xx
  46.         asl.w    #8,D2        ;               0000xx00
  47.         or.w    D2,D1        ;     0000xxxx
  48.         move.w    D1,D2        ;     0000xxxx      0000xxxx
  49.         swap    D2        ;     0000xxxx      xxxx0000
  50.         or.l    D1,D2        ; D2.L
  51.         move.l    D2,D3
  52.         move.l    D2,D4
  53.         move.l    D2,D5
  54.         move.l    D2,D6
  55.         move.l    D2,D7
  56.         move.l    D2,A1
  57.         move.l    D2,A2
  58.         move.l    D2,A3
  59.         move.l    D2,A4
  60.         move.l    D2,A5
  61.         move.l    D2,A6        ; D2-D7/A1-A6   (12 registers)
  62.         move.l    #48,D1        ; bytes per transfer (48)
  63. xbs30        sub.l    D1,D0        ; pre subtract
  64.         bmi    xbs40
  65. xbs31        movem.l D2-D7/A1-A6,-(A0)
  66.         sub.l    D1,D0
  67.         bpl    xbs31
  68. xbs40        add.w    D1,D0        ; less than 48 bytes remaining
  69.  
  70.         move.w    #4,D1        ; by 4's
  71.         sub.w    D1,D0
  72.         bmi    xbs50
  73. xbs41        move.l    D2,-(A0)
  74.         sub.w    D1,D0
  75.         bpl    xbs41
  76. xbs50        add.w    D1,D0
  77.         bra    xbs52
  78. xbs51        move.b    D2,-(A0)    ; by 1's
  79. xbs52        dbf    D0,xbs51
  80.         movem.l (sp)+,D2-D7/A2-A6
  81.         rts
  82.  
  83.         END
  84.  
  85.  
  86.  
  87.